生物信息之独孤九剑——awk
编者按:
在金庸武学体系的众多武功之中,独孤九剑并不是最强劲的武功,它与其他武林绝学有很大的不同,可以说是鹤立鸡群。比如乔峰的降龙十八掌,段誉的六脉神剑,张无忌的九阳神功,石破天的罗汉伏魔神功,这些神功都需要强大的内力支撑,而独孤九剑则不同,不需要内力,这点其实可以从华山派气宗与剑宗的分歧就可以看出来。独孤九剑传人风清扬属于剑宗,更注重招式,而不是像剑宗注重练气。独孤九剑分为总诀式,破剑式,破刀式,破枪式,破鞭式,破索式,破箭式,破掌式,破气式,遇到不同的场景使用关不同的招式,因此,独孤九剑更加注重问题的解决,本质上就是就是通过工具来解决问题。只要学会这九剑,就可以处理很多的问题。学习生物信息也是同样的道理,当然练好内功,掌握很好的基础是非常必要的,但是也可以学习一些小工具,解决一些实际问题。那么从这次内容开始,我们就来给大家介绍生物信息之独孤九剑。
awk是Linux系统中最强大的文本处理工具,很多需要编程才能完成的工作,其实通过awk工具就可以轻松解决。awk可以完成cut,grep,sed,join,uniq,wc等工具的一些功能,是非常强大的工具。相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切分,切开的部分再进行各种分析处理。
为什么awk功能这么强大呢,因为awk本身就是一门编程语言,所以学习awk有一定的难度,这种编程及数据操作语言的最大功能取决于你所掌握的awk技能多少。也就是刚开始可能觉得awk没多少用处,awk能够完成的工作,采用其他方法也都能完成,但是随着越来越熟悉awk的操作,就会发现,awk处理文本如此的高效,几乎可以完成所有的文本处理。
awk有三种执行方式,
第一种是awk命令行模式;
第二种是使用-f选项调用awk程序;
第三种就编程模式;
案例1:输出一个列表任意行;
awk '{print $1}' blast_m8.out #输出blast m8 格式结果的第一行;
awk -F ":" '{print $1,$NF}' passwd.list #通过-F修改默认分隔符为冒号,输出第一行与最后一行;
案例2:格式转换
awk '{print"@" $1"\n"$10"\n""+\n"$11""}' all.sam #将短序列比对上的reads输出出来,生成fastq文件;
案例3:过滤blast结果
awk ’{if ($3>=80 && $4>=100) print $0}' blast_m8.out #过滤blast比对结果,将identity 大于80,并且比对长度大于100bp的结果输出;
案例4:比较
awk '$8>$10' input.txt #输出第8列大于第10列的行。
案例5:匹配输出
awk '$0~ /wang/{print $0}' passwd.list #利用正则表达式,将秘密表中姓wang的账户都输出出来;
案例6:格式化输出
awk 'BEGIN{print "The Program Begin\n"}{if ($3>=80 && $4>=100) print $0}END{print " The Program End\n"}' input.txt #利用BEGIN和END关键字生成报告;
案例7:修改字段和记录分隔符
awk 'BEGIN{OFS="\t"}{print $2,$4,$5}' input.txt #在BEGIN中设定字段分隔符和记录分隔符;
案例8:awk编程计算
awk '{x+=$3}END{print x/NR}' input.txt #计算第三列的平均值,最后在END将其输出出来。
案例9:awk编程比较大小
awk 'BEGIN { max=100 ;print "max=" max} {max=($1 >max ?$1:max); print $1,"Now max is "max}' input.txt #取得文件最后一个域的最大值。
案例10:awk编程求和
awk '{print $0,$3+$4}' input.txt #计算第3列和第4列的和。
案例11:输出固定行内容
awk 'NR>=20&&NR<=80' input.txt #输出第20到第80行内容。
案例12:合并文件
awk 'BEGIN{while((getline<"file1")>0)l[$1]=$0}$1 in l{print $0"\t"l[$1]}' file2 #将两个文件按列合并起来,类似jion命令的功能。
案例13:去重复
awk '!($0 in a) {a[$0];print}' input.txt # 打印不重复的行,类似uniq的功能;
awk '!($2 in l){print;l[$2]=1}' input.txt #计算第二列内容非冗余的次数,类似于uniq的功能;
案例14:统计字符
awk '{for(i=1;i!=NF;++i)c[$i]++}END{for (x in c) print x,c[x]}' input.txt 计算每个字符出现的次数,类似wc的功能。
案例15:替换
awk '{sub(/test/, "no", $0);print}' input.txt 进行替换,类似sed的功能,
案例16:fastq转换为fasta
awk '{getline seq;getline plus;getline qual;sub("@",">",$0);print $0 "\n"seq}' test.fastq
更多内容,请点击链接:
https://item.taobao.com/item.htm?spm=a1z10.3-c.w4002-10284985292.19.ODeefi&id=535825901642